package com.ycj.design.create.singleton;

import java.io.ObjectStreamException;
import java.io.Serializable;

/**
 * 懒汉式（不建议使用，因为在多线程下，就不会产生唯一实例了）
 * 这种写法虽然起到了lazy loading作用，但只能在单线程下使用，
 * @author chuanjieyang
 * @date Nov 20, 2018 11:37:25 AM
 */
public class Singleton  implements Serializable {
    private static final long serialVersionUID = 8650393098362241962L;
    private static Singleton instance;

    private Singleton(){
        if (null != instance) {
            throw new RuntimeException("单例模式被侵犯！");
        }
    }

    public static Singleton getInstance(){
        if(instance==null)instance=new Singleton();
        return instance;
    }

    // 防止反序列化获取多个对象的漏洞。
    // 无论是实现Serializable接口，或是Externalizable接口，当从I/O流中读取对象时，readResolve()方法都会被调用到。
    // 实际上就是用readResolve()中返回的对象直接替换在反序列化过程中创建的对象。
    private Object readResolve() throws ObjectStreamException {
        return instance;
    }
}
